/*f
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia.daos;

import Persistencia.CRUD;
import Persistencia.DAO;
import Persistencia.SeqHelper;
import Persistencia.modelos.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;

/**
 *
 * @author Bruno
 */
public class ArbitraDAO implements DAO<Integer, Arbitra> {

    public void salva(Arbitra obj) {

        
        String arbitro = (obj.getArbitro() == null) ? "null, " : "" + obj.getArbitro().getIdPessoa() + "";
        String partida = (obj.getPartida() == null) ? "null, " : "" + obj.getPartida().getNroPartida() + "";
        CRUD.adiciona("arbitra", "idArbitro,nropartida ",  arbitro + ", " + partida); 

    }

    public void atualiza(Arbitra obj) {
        List<String> c = new ArrayList<String>();
        // c.add("IDJogador");
        c.add("idArbitro");
        c.add("nropartida");

        List<String> a = new ArrayList<String>();
        a.add(String.valueOf(obj.getArbitro().getIdPessoa()));
        a.add(String.valueOf(obj.getPartida().getNroPartida()));
        CRUD.atualiza("arbitra", c, a, " where idpessoa = " + obj.getArbitro().getIdPessoa() + " and nropartida = " + obj.getPartida().getNroPartida());

        c.clear();
        a.clear();
    }

    public void deleta(Integer obj) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(obj);
        String campo = "idpessoa";
        CRUD.deleta("Arbitra", campo, list);
    }

    public Arbitra recupera(Integer obj) {
        try {
            ResultSet rs = CRUD.consulta("select * from Arbitra where idarbitro = " + obj);

            Collection<Integer> arbitroAux = new TreeSet<Integer>();
            Collection<Integer> partidaAux = new TreeSet<Integer>();

            Collection<Arbitra> arbitra = new ArrayList<Arbitra>();
            Arbitra j = null;
            while (rs.next()) {
                j = new Arbitra();                
                j.setNroPartida(rs.getInt("idarbitro"));
                j.setNroPartida(rs.getInt("Nropartida"));
                arbitroAux.add(j.getArbitro().getIdPessoa());
                partidaAux.add(j.getPartida().getNroPartida());
                arbitra.add(j);
            }

            Collection<Arbitro> arbitro = new ArbitroDAO().recuperaLista(arbitroAux);
            Collection<Partida> partida = new PartidaDAO().recuperaLista(partidaAux);

            preencheRelacionamentos(arbitro, partida, j);


            return j;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public Collection<Arbitra> recuperaLista(Collection<Integer> chaves) {
        StringBuilder sb = new StringBuilder();
        Iterator<Integer> it = chaves.iterator();
        while (it.hasNext()) {
            sb.append(it.next()).append(",");
        }
        String ids = sb.toString().substring(0, sb.toString().length() - 1);

        try {
            ResultSet rs = CRUD.consulta("select * from Arbitra where idarbitro in (" + ids + ")");

            Collection<Integer> arbitroAux = new TreeSet<Integer>();
            Collection<Integer> partidaAux = new TreeSet<Integer>();

            Collection<Arbitra> arbitra = new ArrayList<Arbitra>();
            Arbitra j = null;
            while (rs.next()) {
                j = new Arbitra();                
                j.setNroPartida(rs.getInt("idarbitro"));
                j.setNroPartida(rs.getInt("Nropartida"));
                arbitroAux.add(j.getArbitro().getIdPessoa());
                partidaAux.add(j.getPartida().getNroPartida());
                arbitra.add(j);
            }

            Collection<Arbitro> arbitro = new ArbitroDAO().recuperaLista(arbitroAux);
            Collection<Partida> partida = new PartidaDAO().recuperaLista(partidaAux);
            
            for(Arbitra a: arbitra){
                preencheRelacionamentos(arbitro, partida, a);
            }
            
            return arbitra;
            
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public Collection<Arbitra> recuperaTodos() {

     try {
            ResultSet rs = CRUD.consulta("select * from Arbitra");

            Collection<Integer> arbitroAux = new TreeSet<Integer>();
            Collection<Integer> partidaAux = new TreeSet<Integer>();

            Collection<Arbitra> arbitra = new ArrayList<Arbitra>();
            Arbitra j = null;
            while (rs.next()) {
                j = new Arbitra();                
                j.setNroPartida(rs.getInt("idarbitro"));
                j.setNroPartida(rs.getInt("Nropartida"));
                arbitroAux.add(j.getArbitro().getIdPessoa());
                partidaAux.add(j.getPartida().getNroPartida());
                arbitra.add(j);
            }

            Collection<Arbitro> arbitro = new ArbitroDAO().recuperaLista(arbitroAux);
            Collection<Partida> partida = new PartidaDAO().recuperaLista(partidaAux);
            
            for(Arbitra a: arbitra){
                preencheRelacionamentos(arbitro, partida, a);
            }
            
            return arbitra;
            
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    private void preencheRelacionamentos(Collection<Arbitro> arbitros, Collection<Partida> partida, Arbitra j) {
        Iterator<Arbitro> itArbitro = arbitros.iterator();
        while (itArbitro.hasNext()) {
            Arbitro corrente = itArbitro.next();
            if (j.getIdArbitro() == corrente.getIdPessoa()) {
                j.setArbitro(corrente);               
            }
        }

        Iterator<Partida> itPartida = partida.iterator();
        while (itPartida.hasNext()) {
            Partida corrente = itPartida.next();
            if (j.getNroPartida() == corrente.getNroPartida()) {
                j.setPartida(corrente);                
            }
        }
    }   
}
